package com.excel.write;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.excel.entity.DemoData;
import org.joda.time.DateTime;
import org.testng.annotations.Test;

import java.util.List;

/**
 * ClassName:RepeatedWrite
 * Package:com.excel.write
 * Description
 *
 * @Author:@wenxueshi
 * @Create:2023/7/9 - 16:20
 * @Version:v1.0
 */
public class RepeatedWrite {
    private List<DemoData> data() {
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setTitle("字符串" + i);
            data.setDateTime(new DateTime().toString("yyyy年MM月dd日HH时mm分ss秒"));
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    /**
     * 重复多次写入
     * <p>
     * 1. 创建excel对应的实体对象
     * 3. 直接调用二次写入即可
     */
    @Test
    public void repeatedWrite() {
        String path = "D:\\excel\\";
        String fileName = path + "repeatedWrite3" + ".xlsx";
        // 方法1: 如果写到同一个sheet
        // 这里 需要指定写用哪个class去写
        /*try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来
            for (int i = 0; i < 5; i++) {
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<DemoData> data = data();
                excelWriter.write(data, writeSheet);
            }
        }*/

        // 方法2: 如果写到不同的sheet 同一个对象
        // 这里 指定文件
        /*try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i = 0; i < 5; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
                WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<DemoData> data = data();
                excelWriter.write(data, writeSheet);
            }
        }*/

        // 方法3 如果写到不同的sheet 不同的对象
        // 这里 指定文件
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            for (int i = 0; i < 5; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变，我这里为了方便 所以用的同一个class
                // 实际上可以一直变
                WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<DemoData> data = data();
                excelWriter.write(data, writeSheet);
            }
        }
    }

    /**
     * 日期、数字或者自定义格式转换
     * <p>3. 直接写即可
     */
    @Test
    public void converterWrite() {
        String path = "D:\\excel\\";
        String fileName = path + "converterWrite" + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
    }
}
